//
// brief:  		设备温湿度服务
// author: 		yun
// data: 		2017-02-07
// desc:		设备温湿度数据处理
// version: 	v0.1
//

package worker

import (
	"errors"
	"encoding/json"
	"time"
)

const (
	SEV_TEMP_TYPE = "temp"

	// 温湿度服务的两种状态
	SEV_TEMP_ST_ONLINE = "online"
	SEV_TEMP_ST_OFFLINE = "offline"

	// 服务终端发送过来的消息 [状态]
	SEV_TEMP_MSG_STATE = "state"
)

// 温湿度服务状态描述
type tempState struct {
	Temperature	float32			`json:"temp"`
	Humidity	float32 		`json:"humd"`
	Time 		string			`json:"time"`
}

// 与服务终端通信格式
type tempMessage struct {
	Type 	string		`json:"type"`
	Data 	tempState	`json:"data"`
}

var (
	SEV_TEMP_ERR = errors.New("Temp Err")
)

// 温湿度服务
type SevTemp struct {
	// 继承基础服务
	Service

	// 服务信息
	StateInfo tempState
}

// 温湿度服务描述信息
type SevTempInfo struct {
	State 	string		`json:"state"`
	Info 	*tempState	`json:"info"`
}

//
// 建立一个开关设备实例
// sevId: 服务ID号
// post: 接收服务产生推送消息通道
// notify: 接收服务产生通知消息通道
// sev: 建立成功地服务
//
func NewTemp(sevId string, post chan []byte, notify chan []byte) (sev *SevTemp) {

	if sevId == "" || post == nil|| notify == nil {
		return nil
	}

	sev = &SevTemp{
		Service: Service{
			Id: sevId,
			State: SEV_TEMP_ST_OFFLINE,
			Operates: []string{},
			Post: post,
			Notify: notify,
		},
	}

	return
}

//
// 处理设备终端发送过来的消息
//
func (sev *SevTemp)  Message(data interface{}) (err error) {
	err = SEV_TEMP_ERR

	buf, ok := data.([]byte)
	if !ok {
		return
	}

	var msg tempMessage
	e := json.Unmarshal(buf, &msg)
	if e != nil {
		return
	}

	// 处理结果
	if msg.Type != SEV_TEMP_MSG_STATE {
		return
	}


	sev.State = SEV_TEMP_ST_ONLINE

	// 通知家庭，设备信息改变
	state := tempState {
		Temperature: msg.Data.Temperature,
		Humidity: msg.Data.Humidity,
		Time: time.Now().Format("2006-01-02 15:04:05"),
	}

	sev.StateInfo = state

	notify := Notify{
		SevId: sev.Id,
		Notify: SevNotify{
			Type: SEV_TEMP_ST_ONLINE,
			Date: &state,
		},
	}

	notify_buf, _ := json.Marshal(notify)
	sev.Notify <- notify_buf

	return nil
}

//
// 获取服务状态信息
//
func (sev *SevTemp) GetState() interface{} {
	info := SevTempInfo{
		State: sev.State,
		Info: &sev.StateInfo,
	}

	// 离线情况
	if sev.State == SEV_TEMP_ST_OFFLINE {
		info.Info = nil
	}

	info_buf, _ := json.Marshal(info)
	return info_buf

	return nil
}



